---
title: "結構體與聯合體"
description: "從 JavaScript 視角學習 C 語言結構體與聯合體，理解 struct、union、記憶體佈局，並對比 JS 物件。"
---

# 結構體與聯合體

## 1. 概念介紹

### 從 JavaScript 物件到 C 結構體

在 JavaScript 中，物件是動態的鍵值對集合，屬性可隨時新增或刪除。C 語言中的結構體（struct）則用於將相關變數組合，記憶體佈局固定。聯合體（union）允許不同型別共用同一塊記憶體。

> 💡 **核心概念**：C 的結構體與聯合體是建模複雜資料、優化記憶體與系統級程式設計的基礎。

## 2. 語法對比

<UniversalEditor title="結構體與物件對比" compare={true}>
```javascript !! js
// JavaScript - 物件字面值
const person = {
    name: "Alice",
    age: 30,
    isStudent: false
};

// 存取與修改屬性
console.log(person.name);
person.age = 31;

// 動態新增屬性
person.email = "alice@example.com";

// 巢狀物件
person.address = { city: "台北", zip: "100000" };
```

```c !! c
#include <stdio.h>
#include <string.h>

// 結構體定義
typedef struct {
    char name[50];
    int age;
    int isStudent; // 0 表示否，1 表示是
} Person;

int main() {
    // 宣告並初始化結構體
    Person person;
    strcpy(person.name, "Alice");
    person.age = 30;
    person.isStudent = 0;

    // 存取與修改成員
    printf("姓名: %s\n", person.name);
    person.age = 31;

    // C 不支援動態新增屬性
    // 巢狀結構體
    struct Address {
        char city[50];
        char zip[10];
    } address = {"台北", "100000"};

    return 0;
}
```
</UniversalEditor>

## 3. 聯合體

<UniversalEditor title="聯合體" compare={true}>
```javascript !! js
// JavaScript 沒有聯合體，但變數可隨時變型別
let value = 42;
value = "hello";
value = { x: 1 };
```

```c !! c
#include <stdio.h>
#include <string.h>

// 聯合體定義
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    printf("data.i = %d\n", data.i);
    data.f = 220.5;
    printf("data.f = %f\n", data.f);
    strcpy(data.str, "C語言");
    printf("data.str = %s\n", data.str);
    // 只有最後寫入的成員是有效的
    return 0;
}
```
</UniversalEditor>

## 4. 常見陷阱
- C 結構體佈局固定，無法動態新增屬性
- 聯合體成員共用記憶體，只能有效使用一個成員
- 字串操作需注意緩衝區大小（如用 `strcpy`）
- 記憶體對齊與填充會影響結構體大小

## 5. 練習題
1. 定義一個 `Book` 結構體，包含書名、作者與價格，撰寫輸入與輸出程式。
2. 建立一個聯合體，可存放 `int`、`float` 或 `char[10]`，並示範用法。
3. 比較含相同成員的結構體與聯合體的記憶體用量。

## 6. 效能分析
- 結構體提供高效、快取友善的資料佈局
- 聯合體在僅需存一種型別時節省記憶體
- 不當使用聯合體可能導致未定義行為

---

> **小結**：C 的結構體與聯合體是資料建模與記憶體優化的利器。與 JS 物件不同，它們佈局固定且需手動管理記憶體。熟練掌握這些概念對系統程式設計與高效能開發至關重要。 